﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Csla;
using System.Net.Mail;
using System.Net;

namespace ErickOrlando.Utilidades.Mail
{
    /// <summary>
    /// Permite Enviar correos desde el lado del Servidor de Aplicaciones
    /// </summary>
    [Serializable()]
    public class EnvioDeCorreo : CommandBase<EnvioDeCorreo>, IDisposable
    {

        #region   Contructores

        private EnvioDeCorreo(ContenidoMail mContenido)
        {
            Contenido = mContenido;
        }
        /// <summary>
        /// Resultado si se envio o no el Correo
        /// </summary>
        public bool Result { get; private set; }
        /// <summary>
        /// Clase que contiene los datos del Email
        /// </summary>
        public ContenidoMail Contenido { get; private set; }

        #endregion

        #region   Métodos de Instanciación

        /// <summary>
        /// Función que permite enviar Correos Electrónicos en el Servidor. Usar en Bloque Try...Catch
        /// </summary>
        /// <param name="mContenido">Clase que contiene la información del Correo a enviar</param>
        public static bool EnviarEnServer(ContenidoMail mContenido)
        {
            using (var cmd = DataPortal.Execute<EnvioDeCorreo>(new EnvioDeCorreo(mContenido)))
            {
                return cmd.Result;
            }
        }

        /// <summary>
        /// Función que permite enviar Correos Electrónicos. Usar en Bloque Try...Catch
        /// </summary>
        /// <param name="Contenido">Clase que contiene la información del Correo a enviar</param>
        public static bool EnviarCorreo(ContenidoMail Contenido)
        {
            try
            {
                using (MailMessage mail = new MailMessage())
                {
                    mail.From = new MailAddress(Properties.Resources.msgRemitenteEmail, Properties.Resources.msgRemitenteNombre);
                    foreach (var Destinatario in Contenido.ListaDestinatarios)
                        mail.To.Add(Destinatario);
                    foreach (var Destinatario in Contenido.ListaDestinatariosCC)
                        mail.CC.Add(Destinatario);
                    foreach (var Destinatario in Contenido.ListaDestinatariosBCC)
                        mail.Bcc.Add(Destinatario);
                    var CuerpoHTML = new StringBuilder();

                    if (Contenido.ArrayValores.Length > 0)
                        CuerpoHTML.AppendFormat(Contenido.CuerpoMensaje, Contenido.ArrayValores);
                    else
                        CuerpoHTML.Append(Contenido.CuerpoMensaje);

                    CuerpoHTML.AppendLine();
                    CuerpoHTML.AppendLine();
                    CuerpoHTML.AppendLine();

                    CuerpoHTML.Append(Contenido.Html ? Properties.Resources.msgPieDeCorreoHTML : Properties.Resources.msgPieDeCorreo);

                    mail.Subject = Contenido.Asunto;
                    mail.Body = CuerpoHTML.ToString();
                    mail.IsBodyHtml = Contenido.Html;

                    //Limpiamos el StringBuilder
                    CuerpoHTML.Length = 0;

                    var smtp = new SmtpClient();
                    smtp.Host = Properties.Resources.msgServidorEmail;
                    smtp.Send(mail);
                }

                return true;
            }
            catch
            {
                throw;
            }
        }

        #endregion

        #region   DataPortal - Execute

        /// <summary>
        /// Ejecuta el Comando
        /// </summary>
        protected override void DataPortal_Execute()
        {
            Result = EnviarCorreo(Contenido);
        }

        #endregion

        #region   IDisposable Support


        private bool disposedValue;
        /// <summary>
        /// Permite eliminar recursos
        /// </summary>
        /// <param name="disposing">Dispose</param>
        protected virtual void Dispose(bool disposing)
        {
            if (!this.disposedValue)
            {
                if (disposing)
                {
                }
            }
            this.disposedValue = true;
        }

        void IDisposable.Dispose()
        {
            Dispose(true);
            GC.SuppressFinalize(this);
        }

        #endregion

    }
}
